package _17_剑指Offer;

public class _56_剑指OfferII数组中数字出现的次数II {

    // 对于出现三次的数，其中有一个只出现一次，那么将所有数的二进制位加起来，最后对三取余，余下的结果即为存在一次的数

    public int singleNumber(int[] nums) {
        int[] count = new int[32];
        // 统计所有位出现的二进制位数
        for (int num : nums) {
            for (int j = 0; j < 32; j++) {
                // 获取当前位的最低位
                count[j] += num & 1;
                // 无符号右移动
                num >>>= 1;
            }
        }

        int ans = 0;
        // 将计数count恢复到ans上
        for (int i = 31; i >= 0; i--) {
            ans <<= 1;
            ans |= count[i] % 3;
        }
        return ans;
    }

}
